package communicationTCP;

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.List;

import communicationTCP.Dictionnary;

import protocol.*;

/**
 * Serveur TCP permettant la communication avec un client
 * Attend la connexion d'un client
 * Réceptionne les requêtes et renvoie les réponses
 * 
 * @author Alexandre BOURSIER, Nolan Potier
 * 
 */
public class Serveur_TCP {

	public static void main(String args[]) {
		ObjectOutputStream os;
		ObjectInputStream is;
		Object data;
		ServerSocket serveur = null;
		Dictionnary dico;
		final int port = 1025;
		boolean exit = false;
		Socket clientSocket = null;

		// Ouvrir le serveur au port indiqué
		try {
			System.out.println("ouverture du serveur");
			serveur = new ServerSocket(port);
		} catch (IOException e) {
			System.out.println(e);
		}

		// Recevoir les connexions clients
		try {
			clientSocket = serveur.accept();
			System.out.println("connexion client acceptée");

			// Se préparer à la lecture
			is = new ObjectInputStream(clientSocket.getInputStream());
			// Se préparer à l'écriture
			os = new ObjectOutputStream(clientSocket.getOutputStream());
			// Instancier un nouveau dictionnaire
			dico = new Dictionnary();
			// Boucler indéfinimment tant que le serveur ne se ferme pas
			while (!exit) {
				try {
					// Récupérer les données
					data = is.readObject();

					// Récupérer la taquête cible
					Request request = (Request) data;
					Answer rep = null;

					// Retrouver le type de la requête
					switch (request.getType()) {
					case ADD:
						Add requeteA = (Add) data;
						if (dico.add(requeteA.getName(), requeteA.getNickname())) {
							rep = new Answer("Enregistrement effectué");
						} else {
							rep = new Answer("Surnom existant");
						}
						os.writeObject(rep);
						break;
					case LIST:
						protocol.List requeteL = (protocol.List) data;
						if(requeteL.getName() == null) {
							HashMap<String, List<String>> res = dico.getListe();
							if(res.size() == 0){
								rep = new Answer("Liste vide", new HashMap<String, List<String>>());
							}
							else{
								rep = new Answer("Liste des enregistrement", res);
							}
						}
						else {
							HashMap<String, List<String>> res = dico.list(requeteL.getName());
							if(res.size() == 0){
								rep = new Answer("Pas d'enregistrement trouvé pour ce nom", new HashMap<String, List<String>>());
							}
							else{
								rep = new Answer("Liste des enregistrement", res);
							}
						}
						os.writeObject(rep);
						break;
					case EXIT:
						os.close();
						is.close();
						serveur.close();
						System.out.println("fermeture du serveur");
						exit = true;
						break;
					}
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
					os.close();
					is.close();
					serveur.close();
				}
			}
		} catch (IOException e) {
			System.out.println(e);
		}
	}
}
